package ec.edu.ucacue.siop;


import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.List;

import org.hibernate.Session;

import ec.edu.ucacue.siop.dao.material.MaterialDAO;
import ec.edu.ucacue.siop.dao.material.MaterialDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefProdDAO;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefProdDAOImpl;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefUsoDAO;
import ec.edu.ucacue.siop.dao.recurso.MaterialDefUsoDAOImpl;
import ec.edu.ucacue.siop.modelo.material.Material;
import ec.edu.ucacue.siop.modelo.recurso.MaterialDefProd;
import ec.edu.ucacue.siop.modelo.recurso.MaterialDefUso;
import ec.edu.ucacue.siop.modelo.recurso.UnidadFuncional;
import ec.edu.ucacue.siop.proceso.cargaDiaria.CargadorDiarioCalidad;
import ec.edu.ucacue.siop.proceso.cargaDiaria.CargadorDiarioCemento;
import ec.edu.ucacue.siop.proceso.cargaDiaria.CargadorDiarioCrudo;
import ec.edu.ucacue.siop.proceso.cargaDiaria.CargadorDiarioHorno;
import ec.edu.ucacue.siop.proceso.iniciar.aplicacion.CargaInicialOrganizacion;
import ec.edu.ucacue.siop.proceso.iniciar.datosCalidad.CargaVarMesCalidad;
import ec.edu.ucacue.siop.proceso.iniciar.datosCalidad.CargarVariablesCalidad;
import ec.edu.ucacue.siop.proceso.iniciar.datosCalidad.ContPropiedadMaterial;
import ec.edu.ucacue.siop.proceso.iniciar.datosCalidad.LectorHojaExcelRelacionMateriaPropiedad;
import ec.edu.ucacue.siop.proceso.manejoMaterial.ManejoMaterial;
import ec.edu.ucacue.siop.procesoNegocio.iniciar.variables.CargaVarMesCrudCem;
import ec.edu.ucacue.siop.procesoNegocio.iniciar.variables.CargaVarMesHorno;
import ec.edu.ucacue.siop.service.cargas.CrearProductoInsumoUnidadFuncional;
import ec.edu.ucacue.siop.service.cargasDiarias.CargaDiariaService;
import ec.edu.ucacue.siop.service.cargasDiarias.CargaDiariaServiceImpl;
import ec.edu.ucacue.siop.utilidades.HibernateUtil;

public class App {


	public static void main(String[] args) {
		
		/*
		 * Aplicacion de entrada para controlar inicializacion del sistema.
		 * 
		 * Llama a un grupo de servicios inicializacion
		 * 
		 * carga de variables de control diaria
		 * 
		 * calculo de las estadisticas de produccion
		 * 
		 */
		
		CargaDiariaService cds = new CargaDiariaServiceImpl();
		
		
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader bf = new BufferedReader (isr);
		
		System.out.println("---------- Prototipo de interfaz ---------- ");
		int ent = 0;
		do {
	    	System.out.println(" -- Seleccione \n" +
	    			" 1-  Creacion de la base de datos \n" +
	    			" 2-  Carga de los valores 2014 \n" +
	    			" 3-  Carga de los valores iniciales 2015 \n" +
	    			" 4-  Carga de valores diarios de crudo \n" +
	    			" 5-  Carga de valores diarios de horno \n" +
	    			" 6-  Carga de valores diarios de cemento \n" +
	    			" 7-  Carga de valores diarios de calidad \n" +
	    			" 8-  Generacion de estadistica de una variable \n" +
	    			" 9-  Generacion de estadisticas para las variables de una unidad \n" +
	    			"20- Fin"
	    );
	    	String linea;
			try {
				linea = bf.readLine();
				ent = Integer.parseInt(linea);
				switch (ent) {
				case 1:
					linea = "inicio";
					File dirIni = new File(linea);
					if(dirIni.exists()){
						CargaInicialOrganizacion cargador = new CargaInicialOrganizacion();
						cargador.cargar("inicio", "estructuraProduccion.xls");
						System.out.println("finalizo la carga inicial");
						LectorHojaExcelRelacionMateriaPropiedad lector = new LectorHojaExcelRelacionMateriaPropiedad();
						String nomArchivo = "inicio/material_propiedades.xls";
						ManejoMaterial manejo = new ManejoMaterial();
						boolean condFin = true;
						if(lector.leer(nomArchivo)){
							List<ContPropiedadMaterial> lista = lector.getListaContProp();
							for(int i=0; i<lista.size() && condFin; i++) {
								long vector[] = lista.get(i).getIdPropiedad(); 
								if(manejo.agregarListaPropiedaMaterial(lista.get(i).getIdMaterial(), vector)){
							
								}
								else {
									condFin = false;
								}
							}
							if(condFin){
								System.out.println("Cargada lista de materiales");
							}
						}
					}
					else {
						System.out.println("El directorio no existe");
					}
					// iniciar variables de productos e insumos para cada UF
					CrearProductoInsumoUnidadFuncional cpiUF = new CrearProductoInsumoUnidadFuncional();
					cpiUF.enlazar();
					System.out.println("Finalizado el enlaze variables de produccion Area");
					//
					CargarVariablesCalidad cargador = new CargarVariablesCalidad();
					String nomArchivo = "inicio/filtroCalidad.xls";
					if(cargador.cargar(nomArchivo)){
						System.out.println("termino bien");
					}
					else {
						System.out.println("Termino con error");
					}
					
					break;
				case 2:
					System.out.println("Introducir la ruta de los datos 2014");
					
					String nomDirCarga = bf.readLine();
					File dirCarga2014 = new File(nomDirCarga);
					if(dirCarga2014.isDirectory()){
						System.out.println("entro al directorio");
						String nomDirCrudo = dirCarga2014+"/CRUDO";
						File dirCrudo = new File(nomDirCrudo);
						if(dirCrudo.isDirectory()) {
							String[] lista = dirCrudo.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirCrudo+"/"+lista[i];
								CargaVarMesCrudCem cargadorCrCe = new CargaVarMesCrudCem();
								if(cargadorCrCe.cargar(nomDirMensual, "Reporte M. Crudo","2014")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error " + cargadorCrCe.getError());
								}
							}
						}
						else{
							System.out.println("El directorio CRUDO no existe");
						}
						String nomDirHorno = dirCarga2014+"/HORNO";
						File dirRaizHorno = new File(nomDirHorno);
						if(dirRaizHorno.isDirectory()){
							String[] lista = dirRaizHorno.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirHorno+"/"+lista[i];
								CargaVarMesHorno cargadorHor = new CargaVarMesHorno();
								if(cargadorHor.cargar(nomDirMensual,"2014")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error " + cargadorHor.getError());
								}
							}
						}
						else {
							System.out.println("El directorio HORNO no existe");
						}
						String nomDirRaizCem = dirCarga2014+"/CEMENTO"; 
						File dirRaizCem = new File(nomDirRaizCem); 
						if(dirRaizCem.isDirectory()){
							String[] lista = dirRaizCem.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirRaizCem+"/"+lista[i];
								CargaVarMesCrudCem cargadorCem = new CargaVarMesCrudCem();
								if(cargadorCem.cargar(nomDirMensual, "Reporte M. Cemento", "2014")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error " + cargadorCem.getError());
								}
							}
						}
						else {
							System.out.println(" No existe el directorio CEMENTO");
						}
						// Carga datos de calidad
						String nomDirRaizCal = dirCarga2014+"/CALIDAD";
						File dirRaizCal = new File(nomDirRaizCal); 
						if(dirRaizCal.isDirectory()){
							String[] lista = dirRaizCal.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirRaizCal+"/"+lista[i];
								CargaVarMesCalidad cargadorMCal = new CargaVarMesCalidad();
								if(cargadorMCal.cargar(nomDirMensual, "Reporte Diario","2014")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error en " + nomDirMensual +" " + cargadorMCal.getError());
								}
							}
						}
						else {
							System.out.println(" No existe el directorio de Calidad");
						}						
					}
					else {
						System.out.println("Directorio global " + nomDirCarga + " no es un directorio valido");
					}

					System.out.println("Finalizada inicializacion 2014");
					break;
				case 3:
					System.out.println("Introducir la ruta de los datos 2015");
					
					String nomDirCarga15 = bf.readLine();
					File dirCarga2015 = new File(nomDirCarga15);
					if(dirCarga2015.isDirectory()){
						String nomDirCrudo = dirCarga2015+"/CRUDO";
						File dirCrudo = new File(nomDirCrudo);
						if(dirCrudo.isDirectory()) {
							String[] lista = dirCrudo.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirCrudo+"/"+lista[i];
								CargaVarMesCrudCem cargadorCrCe = new CargaVarMesCrudCem();
								if(cargadorCrCe.cargar(nomDirMensual, "Reporte M. Crudo","2015")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error " + cargadorCrCe.getError());
									break;
								}
							}
						}
						else{
							System.out.println("El directorio CRUDO no existe");
						}
						String nomDirHorno = dirCarga2015+"/HORNO";
						File dirRaizHorno = new File(nomDirHorno);
						if(dirRaizHorno.isDirectory()){
							String[] lista = dirRaizHorno.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirHorno+"/"+lista[i];
								CargaVarMesHorno cargadorHor = new CargaVarMesHorno();
								if(cargadorHor.cargar(nomDirMensual,"2015")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error " + cargadorHor.getError());
									break;
								}
							}
						}
						else {
							System.out.println("El directorio HORNO no existe");
						}
						String nomDirRaizCem = dirCarga2015+"/CEMENTO"; 
						File dirRaizCem = new File(nomDirRaizCem); 
						if(dirRaizCem.isDirectory()){
							String[] lista = dirRaizCem.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirRaizCem+"/"+lista[i];
								CargaVarMesCrudCem cargadorCem = new CargaVarMesCrudCem();
								if(cargadorCem.cargar(nomDirMensual, "Reporte M. Cemento", "2015")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error " + cargadorCem.getError());
									break;
								}
							}
						}
						else {
							System.out.println(" No existe el directorio CEMENTO");
						}
						// Carga datos de calidad
						String nomDirRaizCal15 = dirCarga2015+"/CALIDAD";
						File dirRaizCal15 = new File(nomDirRaizCal15); 
						if(dirRaizCal15.isDirectory()){
							String[] lista = dirRaizCal15.list();
							ordenar(lista);
							for(int i=0;i<lista.length; i++) {
								String nomDirMensual = nomDirRaizCal15+"/"+lista[i];
								CargaVarMesCalidad cargadorMCal = new CargaVarMesCalidad();
								if(cargadorMCal.cargar(nomDirMensual, "Reporte Diario","2015")){
									System.out.println("Cargado " + nomDirMensual);
								}
								else {
									System.out.println("Error en " + nomDirMensual +" " + cargadorMCal.getError());
								}
							}
						}
						else {
							System.out.println(" No existe el directorio de Calidad");
						}
						
					}
					else {
						System.out.println("Directorio global " + nomDirCarga15 + " no es un directorio valido");
					}

					System.out.println("Finalizada inicializacion 2015");	
					break;
					
				case 4:
					System.out.println("Introduzca dia, mes y a#o en el formato aaaa-mm-dd");
					String fecha = bf.readLine();
					String resLec = cds.cargarCrudo(fecha);
					if(resLec==null) {
						System.out.println("Ya se cargo");
					}
					else{
						System.out.println("Error en la carga del archivo. Razon: " + resLec);
					}
					break;
				case 5:
					System.out.println("Introduzca dia, mes y a#o en el formato aaaa/mm/dd");
					fecha = bf.readLine();
					resLec = cds.cargarHorno(fecha);
					if(resLec==null) {
						System.out.println("Ya se cargo");
					}
					else{
						System.out.println("Error en la carga del archivo. Razon: " + resLec);
					}
					break;				
				case 6:
					System.out.println("Introduzca dia, mes y a#o en el formato aaaa-mm-dd");
					fecha = bf.readLine();
					resLec = cds.cargarCemento(fecha);
					if(resLec==null) {
						System.out.println("Ya se cargo");
					}
					else{
						System.out.println("Error en la carga del archivo. Razon: " + resLec);
					}
					break;
				case 7:
					System.out.println("Introduzca dia, mes y a#o en el formato aaaa-mm-dd");
					fecha = bf.readLine();
					resLec = cds.cargarCalidad(fecha);
					if(resLec == null) {
						System.out.println("Ya se cargo");
					}
					else{
						System.out.println("Error en la carga del archivo. Razon: " + resLec);
					}
					break;	
				case 8:
					System.out.print("Introduzca el rango de fecha :");
					linea = bf.readLine();		
					System.out.print( "el nombre de la variable y nombre de la Unidad o sistema separados por ,");
					break;
				case 9:
					System.out.print( "el nombre de la variable y nombre de la Unidad o sistema separados por ,");
					break;
					

				default:
					break;
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} while(ent != 20);
		System.out.println("Adios");
		 
	}
	
	private static void ordenar(String[] listadoArchivos) {
		for(int i=0; i<listadoArchivos.length-1;i++) {
			
			for(int j=i+1; j<listadoArchivos.length; j++) {
				if(listadoArchivos[i].compareTo(listadoArchivos[j]) > 0) {
					String aux = listadoArchivos[i];
					listadoArchivos[i] = listadoArchivos[j];
					listadoArchivos[j] = aux;
				}
			}
		}
	}
}
